package com.clstu.regexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 探究正则表达式底层的匹配原理
 */
public class RegExpTheory {
    public static void main(String[] args) {
        //内容
        String content = "那是因为中国是世界上唯一一个没有出现文明断代的国家，至今为止，中国已经拥有5000千多年的悠远历史了。\n" +
                "\n" +"不过在西方，有的学者却不承认中华文明的地位，他们认为中国虽然自称有5千年的历史，但其中有1500年的时间里，" +
                "是没有任何史料记载的，所以中国最多只有3500年的历史，并不足以称为文明古国。";
        String regStr="(\\d\\d)(\\d\\d)";//正则表达式
        Pattern pattern = Pattern.compile(regStr);//创建模式对象
        //创建匹配器,按照正则表达式的规格取匹配content中的字符串
        Matcher matcher = pattern.matcher(content);
        /**
         * group()源码:
         *     public String group(int group) {
         *         if (first < 0)
         *             throw new IllegalStateException("No match found");
         *         if (group < 0 || group > groupCount())
         *             throw new IndexOutOfBoundsException("No group " + group);
         *         if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
         *             return null;
         *         return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();//根据传入的参数返回对应的分组对象
         *     }
         */
        //find()方法做的事就是每次将找到的总下标的开始结束位置记录下来(总:[group[0],group[1]),1组:[group[2],group[3])...以此类推 (前闭后开))
        //注意:执行一次group中的内容就会刷新一次..(且开始匹配的位置是 上一次总串结束的位置+1 )
        while (matcher.find()){
            System.out.println("总: "+matcher.group(0));//0.表示正则表达式总体匹配到的结果子串
                                               // (1.表示分组后第一个结果子串(如果有分组)
            //                                     2.表示分组后第二个结果子串(不可填入超过的分组号)....以此类推...)
            System.out.println("1组: "+matcher.group(1));
            System.out.println("2组: "+matcher.group(2));
        }

    }
}
